perm filename JUST.F4[MSS,LCS]1 blob sn#145075 filedate 1975-02-11 generic text, type T, neo UTF8
00100	C  TO JUSTIFY SEVERAL MSS FILES AT ONCE. (UP TO 10.)
00200		COMMON/Q/ RN(20000),PWDS(2500) ,RSTFAC(120),STFF(120),
00400		1 V(200),JR(120),P1,P2,I,M
00450	C  M=NUM OF STAVES. (BY 8S)
00500		COMMON JY,L,RJH,RJD,RDIS /RS/JW(120)
00550		
00700		TYPE 1
00800	1	FORMAT(' FILE NAME 1?  '$)
00900		ACCEPT 200,N1
01000	200	FORMAT(A5)
01100		TYPE 300
01200	300	FORMAT(' LAST NAME?  '$)
01300		ACCEPT 200,N2
01400		TYPE 100
01500	100	FORMAT(' POS.1, POS.2 -  '$)
01600		ACCEPT 111,P1,P2
01700	111	FORMAT(2F)
01800	CC	IF(P2.EQ.0)P2=200
01900	
01910		JW(1)=1
01920		JR(1)=1
02000		M=1
02100		L=0
02200		JX=1
02300		IX=1
02400		NX=1
02500		NM=N1
02600	40	CALL IFILE(1,NM)
02700		READ (1)J,I,
02800		1 (PWDS(K),K=JX,JX+J),(RN(K),K=IX,I+IX-2),ISCR,(V(K),K=1,ISCR),
02900		1 ISCR,(V(K),K=1,ISCR),(RSTFAC(K),K=NX,NX+7),(STFF(K),K=
03000		1 NX,NX+7),K
03100	
03200		IF(P1.EQ.999)GO TO 2
03210	C ********* TYPE 999 AS POS1. FOR 'CONVERT', NAME2 WILL BE OUTPUT NM.
03300		RX=NX-1
03500	
03600		DO 41 K=JX,JX+J
03700		PWDS(K)=PWDS(K)+L
03800		KX=PWDS(K)+3
03820	C  +3 IS FOR STAFF #
03840	41	RN(KX)=RN(KX)+RX
03900		IX=I+IX-1
03910		L=IX-1
04000		JX=J+JX
04010		JW(M+1)=JX
04020	C  POINTER TO START OF PWDS FOR EACH FILE
04030		JR(M+1)=IX  
04100		NX=NX+8
04200		IF(IX.LT.19500)GO TO 400
04300		RRT=IX
04400		TYPE 111,RRT
04500	400	IF(NM.EQ.N2)GO TO 5
04600		NM=NM+2
04700		M=M+1
04800		GO TO 40
04900	
05700	2	JJ=1
05800	3001	L=PWDS(JJ)
05900		K=L+1
06000		A=RN(K)
06010		Z=RN(L)
06100		IF(A.LT.5.OR.(A.GT.10.AND.A.NE.20))GO TO 3002
06300		IF(A.NE.6)GO TO 3003
06400		RN(K)=13
06500		GO TO 3002
06600	3003	IF(A.NE.5)GO TO 3004
06700		RN(K)=10
06800		IF(Z.LT.4)GO TO 3010
06900		X=RN(L+5)
07000		RN(L+5)=RN(L+6)
07100		RN(L+6)=X
07200		GO TO 3002
07300	3004	IF(A.NE.7)GO TO 3005
07400		RN(K)=17
07500		GO TO 3010
07600	3005	IF(A.EQ.8)RN(K)=5
07700		IF(A.EQ.9)RN(K)=6
07800		IF(A.NE.10)GO TO 3006
07900		RN(K)=8
08000	 	GO TO 3010
08100	3006	IF(A.EQ.20)RN(K)=7
08200		IF(A.NE.18)GO TO 3002
08300	3010	FORMAT(' ITEM ',I3,', CODE ',F3.0)
08400		TYPE 3010,JJ,A
08410	3002	A=RN(L+2)
08420		RN(L+2)=RN(L+3)
08430		RN(L+3)=A
08500		A=L+Z+3
08600		JJ=JJ+1
08700		IF(A.EQ.PWDS(JJ))GO TO 3001
10000		MX=1
10100		IF(N2.NE.' ')NM=N2
10200		GO TO 6
10300	
10400	5	I=JX-1
10500	C  TOTAL IN RN ('I' IN MXX.F4)
10600		CALL JJUST
10700	
10800	C  START OF WRITER
10810		NM='AAAAA'
10900	6	JX=1
11000		IX=1
11100		NX=1
11300		L=0
11400	
11600		MX=M
11700		M=1
11800		CALL OFILE(21,NM)
11900		IF(P1.EQ.999)GO TO 3
12000		J=JW(M+1)-JW(M)
12100		I=JR(M+1)-JR(M)+1
12200		P1=PWDS(JX+J)
12300		RX=NX-1
12400		DO 61 K=JX,JX+J
12500		KX=PWDS(K)
12600		PWDS(K)=KX-L
12700		KX=KX+3
12800	61	RN(KX)=RN(KX)-RX
12900	3	L=I+IX-2
13000		WRITE(21)J,I,
13100		1 (PWDS(K),K=JX,JX+J),(RN(K),K=IX,L),ISCR,(V(K),K=1,ISCR),
13200		1 ISCR,(V(K),K=1,ISCR),(RSTFAC(K),K=NX,NX+7),(STFF(K),K=
13300		1 NX,NX+7),K,K
13400		PWDS(JX+J)=P1
13500		TYPE 60,NM
13600	
13700		IF(M.EQ.MX)CALL EXIT
13800		M=M+1
13900		JX=JW(M)
14000		IX=JR(M)
14100	
14200		NX=NX+8
14300		END FILE 21
14400		NM=NM+2
14500		GO TO 6
14600	60	FORMAT(1XA5)
14700		END
14800	
14900		SUBROUTINE JJUST
15000		DATA RSP/.5/,RI/4.5/,RPX/.2/
15100		COMMON JY,L,RJH,RJD,RDIS
15200		COMMON/Q/ RN(20000),PWDS(2500) 
15300		1,RSTFAC(120),STFF(120),R(2,100),JR(120),P1,P2,I,M
15400	
15500		DIMENSION IR(2,100)
15600		EQUIVALENCE (R,IR)
15700		JJB=-1
15800		IX=PWDS(I+1)-1
15900		PRCNT=1.
16000		JB=0
16100		RRT=P2
16200		RZRO=P1
16300		RJD=P1
16400		IF(RRT.EQ.0)RRT=200
16500		IF(RZRO.EQ.0)RZRO=.001
16600		JCNT=0
16700		RJSZ=RI
16800	CC	RJF=0
16900		ML=1
17000		ROV=RRT
17100	19	IF(JCNT.GT.9)GO TO 101
17200		RJSZ=RJSZ-RPX	
17300		JCNT=JCNT+1
17400	C  TEMPORARY COUNTER
17500		TYPE 111,JCNT
17600	111	FORMAT(I4)
17700	
17800		DO 11 KN=-3,M*8-4
17900		RSPC=0
18000	CC	MQ=MOD(KN,8)
18100	CC	IF(MQ.EQ.0)MQ=8
18200	CC	MQ=MQ-4
18300	CC	RJH=MQ
18400		RJH=KN
18500		N=0
18600	
18700		DO 2 K=1,I
18800		L=PWDS(K)
18900		RA=RN(L+1)
19000		RB=RN(L+2)
19100		IF((RN(L+3).NE.RJH.AND.RA.NE.4)
19200		1 .OR.RB.LT.RZRO) GO TO 2
19300		IF(RA.EQ.1)GO TO 10
19400	27	IF(RA.GT.4.AND.RA.NE.18.AND.RA.NE.7)GO TO 2
19500		IF(RA.EQ.4.AND.RN(L).GT.2)GO TO 2
19600	C  SHOULD CHECK ON BAR LINES NO MATTER WHICH STAFF
19700	10	N=N+1
19800		R(1,N)=RB
19900		IR(2,N)=L
20000		IF(N.EQ.100)GO TO 28
20100	C  ONLY TREATS 100 ITEMS AT A TIME.
20200	
20300	
20400	2	CONTINUE
20500	
20600		IF(N.EQ.0)GO TO 11
20700	28	KM=JFAC(L)
20800	C  SEE FUNCTION JFAC.  RSTFAC PNTR.
20900		DO 23 K=1,N
21000	23	IF(RN(IR(2,K)+1).NE.4)GO TO 24
21100	C  SKIPS IF ONLY BAR LINES ON THIS STAFF
21200		GO TO 11
21300	24	RSTJC=RSTFAC(KM*8+KN+4)*PRCNT
21400		CALL SORT2(R,N)
21500	
21600	C  JUMP IF LAST IS A BAR LINE.
21700		K=0
21800		JLDGR=0
21900	     	JX=0
22000	22	K=K+1
22100	122	L=IR(2,K)
22200		RA=RN(L+1)
22300		RB=0
22400		RX=RN(L+5)
22500		RY=1
22600		RW=AMOD(RN(L+4),100.)
22700		IF(RA.GT.1)GO TO 4
22800		RZ=RN(L+7)
22900		IF(LDGR.NE.JLDGR)JLDGR=0
23000		LDGR=0
23100		JY=K
23200		DO 32 JJ=JY+1,N+1
23300		K=JJ
23400	32	IF(R(1,JJ)-R(1,JJ-1).GT.RSP)GO TO 35
23500	C  FOUND HOW MANY MEMBERS TO CHORD.
23600	35	RB=0
23700		K=K-1
23800		RQ=0
23900		RD=0
24000	125	IF(AMOD(RN(L+4),200.).GT.60.)RY=.6
24100		DO 37 JJ=JY,K-1
24200		IF(RD.NE.0)GO TO 38
24300	C FINDS ONLY HIGH OR! LOW LED. LINE.
24400		JIR=IR(2,JJ)
24500		RW=AMOD(RN(JIR+4),100.)
24600		IF(RW.LE.11.AND.RW.GE.2)GO TO 38
24700		LDGR=-1
24800		IF(RW.GT.11)LDGR=1
24900		IF(JLDGR.EQ.LDGR)GO TO 36
25000		JLDGR=LDGR
25100	C LDGR IS FOR LEDGER LINES.
25200		GO TO 38
25300	36	RD=1.5
25400		RQ=RD
25500	38	IF(RB.GT.2)GO TO 222
25600	C  JUMP IF LARGE SPACE AFTER NOTE IS ALREADY SET UP.
25700		RZZ=RN(JIR+7)
25800		RE=RN(JIR+5)
25900		IF(RB.LT.2.AND.((AMOD(RZZ,10.).NE.0.AND.RE.LT.20).
26000		1 OR.RZZ.GE.10))RB=1.5+EXTEN(RZZ)
26100	C  SPACE FOR DOT OR TAIL(IF STEM UP)
26200		IF(ABS(RN(JIR+6)).EQ.10)RB=RB+2
26300	C  FOR CHORD TONES ON RIGHT OF STEM UP.
26400	C  LOOKS THROUGH ALL NOTES OF A CHORD.
26500	222	IF(AMOD(RE,10.).EQ.0)GO TO 37 
26600	C  JUMP IF NO ACCIS.
26700	425	RD=2*RY+EXTEN(RE)
26800		IF(RQ.GT.RD)RD=RQ
26900		RQ=RD
27000	C  FUNCT. EXTEN=AMOD(X,1.)*10.
27100	37 	CONTINUE
27200		IF(RY.NE.1)RB=RB-.5*RJSZ
27300	C  MINI NOTES NEED LESS SPACE
27400	25	IF(JX.GT.0)R(2,JX)=R(2,JX)+RD*RSTJC
27500		GO TO 17
27600	4	IF(RA.NE.3)GO TO 29
27700		RB=3
27800		IF(RX.GT.100)RB=1.5
27900	C  CHECK ON SIZE NEEDED FOR CLEFS
28000	29	IF(RA.NE.4)GO TO 26
28100		RB=-RJSZ/2
28200		RD=.9
28300		GO TO 25
28400	26	IF(RA.NE.18)GO TO 30
28500		IF(RW.GT.9.OR.RX.GT.9)GO TO 31
28600	C  CHECKS FOR 2-DIGIT METERS
28700		RB=-1
28800		RD=1
28900		GO TO 25
29000	31	RB=2
29100		RD=3
29200		GO TO 25
29300	30	IF(RA.NE.7)GO TO 17
29400	CC	RB=2*(ABS(RW)-2)
29500		RB=2*(ABS(RW)-1)-2
29600		RD=2
29700		GO TO 25
29800	C  SPACES FOR CORRECT NUM OF ACCIS.
29900	17	RC=(RB+RJSZ)*RSTJC
30000	C  RJSZ=DEFAULT SIZE
30100		JX=JX+1
30200		R(2,JX)=RC
30300		R(1,JX)=R(1,K)
30400	3	IF(K.LT.N)GO TO 22
30500		RA=R(1,1)
30600		RB=R(2,1)
30700	
30800		DO 13 KX=2,JX
30900		RE=R(1,KX)
31000	C  POS. BEFORE SHIFTING
31100		IF(ABS(RE-RA).GT..5)GO TO 14
31200		IF(R(2,KX).GT.RB)GO TO 16
31300	C  SKIPS DOUBLE STOPS AND VERY CLOSE ITEMS
31400		GO TO 13
31500	CC	IF(RZZ.LE.RB)GO TO 13
31600	C  JUMP WHEN SPACE TO ADD IS SMALLER THAN WHAT'S ALREADY THERE
31700	CC	RB=RZZ-RB
31800	14	RD=RA+RB-RE
31900		IF(RD.LE.0)GO TO 16
32000	C  THERE'S ENOUGH ROOM
32100	CC	RD=RA+RB-RE+RD
32200		RJD=RE+RSPC-.001
32300		RJE=1000
32400	C  MAYBE MORE? ↑↑↑↑↑
32500		RJH=RD
32600		RJI=0
32700		RSPC=RSPC+RD
32800	C  RSPC SAVES TOTAL SPACE ADDED
32900	C  GO EXPAND IT
33000		IF(R(2,KX).NE.0)GO TO 166
33100	16	RB=R(2,KX)
33200	13	RA=RE
33300	11	CONTINUE
33400	110	IF(ROV.LE.RRT+.01)GO TO 18
33500		IF(RJSZ.GT.4)RJSZ=4
33600		PRCNT=(ROV-RZRO)/(RRT-RZRO)
33700		RP=RJSZ/(RJSZ-RPX)
33800		TYPE 1111,PRCNT,RP
33900	1111	FORMAT(1X2F9.6)
34000		IF(PRCNT.GT.RP)GO TO 19
34100		RJD=RZRO
34200		RJE=ROV
34300		RJH=RZRO
34400		RJI=RRT-.001
34500	C  JUSTIFYING SPACE DIMINISHES EACH TIME AROUND.
34600		ML=2
34700		GO TO 66
34800	18	ML=3
34900		RJH=RRT
35000		RJI=RRT+2
35100	C  GOES BACK TO PICK UP DANGLING ITEMS(BEYOND RRT)
35200		RJD=RRT
35300		RJE=RVX
35400	166	JJB=-1
35500		JB=0
35600	66	JY=1
35700		IF(JCNT.EQ.1)RVX=ROV+2
35800	C  RVX SHOULD BE FARTHEST POINT TO RIGHT.
35900		L=JY
36000		IF(RJI.NE.0)RDIS=(RJI-RJH)/(RJE-RJD)
36100	
36200	6551	RB=RN(JY)
36300		JB=JB+1
36400	C  IF STAFF#>4, ALL STAVES ARE MOVED.
36500		RA=RN(JY+1)
36600	C SKIPS IF NOT SPECIAL CODE NUM.
36700		RN2=RN(JY+2)
36800		IF(RN2.GT.RJE)GO TO 7551
36900		RC=-1
37000		RD=0
37100		IF(RA.EQ.8.OR.RA.EQ.9.OR.RA.EQ.20)RD=-1
37200		IF(RA.EQ.4..OR.RD.OR.RN(JY+5).EQ.50)RC=0
37300	C RC=0 FOR CODES 4,8,9
37400		RN6=RN(JY+6)
37500		IF(RN2.GE.RJD)GO TO 9551
37600	      IF(RC.OR.(RC.EQ.0.AND.(RN6.LE.RJD.OR.RN6.GE.RJE)))GO TO 7551
37700	C RIGHT SIDE IS BEFORE OR AFTER MOVE AREA.
37800	9551	IF(JJB)JJB=JB
37900	C   (50=CRESC., DECRESC.)
38000		RQ6=RN6-RJE
38100		RX=0
38200		RV=0
38300		IF(RA.NE.9.OR.RB.LT.7)GO TO 21
38400		RX=RN(L+9)
38500		RY=RX-RJE
38600		RZ=RJD-RX
38700		IF(RN(L+10).LT.30)GO TO 221
38800		RW=RN(L+8)
38900		IF(RW.GE.RJD.AND.RW.LE.RJE)RV=-1
39000	221	IF(RY.AND.RZ)RX=-1
39100	C PARTIAL BEAM IS WITHIN MOVE AREA.
39200	21	IF(RJI.EQ.0)GO TO 2551
39300		IF(RN2.GE.RJD)CALL MVBX(RN,2)
39400		IF(RC)GO TO 7552
39500		IF(RA.EQ.4..AND.RB.LT.4)GO TO 7552
39600		IF(RQ6)CALL MVBX(RN,6)
39700	C  END POINT OUTSIDE OF MOVE RANGE NOT AFFECTED.
39800		IF(RA.NE.9)GO TO 7552
39900		IF(RX)CALL MVBX(RN,9)
40000		IF(RV)CALL MVBX(RN,8)
40100	C  ONLY TRUE WHEN RA=9
40200		GO TO 7552
40300	
40400	2551	IF(RN2.GE.RJD)RN2=RN2+RJH
40500		RN(L+2)=RN2
40600	      IF(RQ6.AND.(RD.OR.(RA.EQ.4.AND.RB.GT.3.)))RN(L+6)=RN(JY+6)+RJH
40700		IF(RX)CALL MVBEAM(RN,9,JY,L,RJH)
40800		IF(RV)CALL MVBEAM(RN,8,JY,L,RJH)
40900		IF(RN2.GT.ROV)ROV=RN2
41000	C ??? NOT YET FIXED FOR ENDS OF SLURS OR LINES
41100	7552	L=RB+3+L
41200	7551	JY=RB+3+JY
41300		L=JY
41400		IF(JY.LT.IX)GO TO 6551
41500		GO TO (16,18,101),ML
41600	C ↑↑↑↑↑↑????
41700	101	JJB=1
41800		END
41900		
42000	C  THESE MOVE ENDS OF PARTIAL INNER BEAMS.
42100		SUBROUTINE MVBEAM(R,I,JY,L,W)
42200	C  L AND JY ARE FOR MOVES TO DIFF. STAFF.
42300		DIMENSION R(1)
42400		Y=R(JY+I)
42500		Z=ABS(Y)
42600		IF(Z.LT.100.)GO TO 1
42700	C  NEXT FOR MINIS, DIAMONDS, 'X' NOTES. (LIMIT OF +-99 ON ALTITUDE.)
42800		Y=AMOD(Y,100.)
42900		X=Y+W
43000		Z=Z-ABS(Y)+ABS(X)
43100	C  PUTS ALL INTO POSITIVE
43200		IF(X)Z=-Z
43300		GO TO 2
43400	1	Z=Y+W
43500	2	R(L+I)=Z
43600		END
43700	
43800		SUBROUTINE MVBX(R,I)
43900		COMMON JY,L,RJH,RJD,RDIS
44000		DIMENSION R(1)
44100		R(L+I)=RJH+(R(JY+I)-RJD)*RDIS
44200		END
44300	
44400		SUBROUTINE EXCH(X,Y)
44500		Z=X
44600		X=Y
44700		Y=Z
44800		END
44900		SUBROUTINE SORT2(RPOS,M)
45000		DIMENSION RPOS(2,1000)
45100		L=2
45200	3	J=-1
45300		RX=RPOS(1,L-1)
45400		DO 2 K=L,M
45500		IF(RPOS(1,K).GE.RX)GO TO 2
45600		RX=RPOS(1,K)
45700	C   WHY WERE ALL THE RX'S  JX ????? 9/6/73
45800		J=K
45900	2	CONTINUE
46000		IF(J)GO TO 4
46100		K=L-1
46200		CALL EXCH(RPOS(1,K),RPOS(1,J))
46300		CALL EXCH(RPOS(2,K),RPOS(2,J))
46400	4	L=L+1
46500		IF(L.LE.M)GO TO 3
46600		END
46700	
46800		FUNCTION EXTEN(X)
46900		EXTEN=AMOD(X,1.)*10.
47000		END
47100	
47200		FUNCTION JFAC(L)
47300	C  FINDS RSTFAC POINTER
47400	CC	COMMON /RS/JW(80)
47500		COMMON/Q/ RN(20000),PWDS(2500) 
47600		1,RSTFAC(120),STFF(120),R(2,100),JR(120),P1,P2,I,M
47700		K=0
47800	1	K=K+1
47900		IF(L.GE.JR(K))GO TO 1
48000		JFAC=K-2
48100		END